# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:张广勤
@Web site: https://www.tunan.wang
@Github:www.github.com
 
@File:app1.py
@Time:2022/4/15 9:55

@Motto:不积跬步无以至千里，不积小流无以成江海！
"""
'''
app1.py  books
'''

#import 第三方库
from importlib import reload
#用类做表单时可不用flash
from flask import Flask,render_template,flash,request,redirect,url_for
from flask_sqlalchemy import SQLAlchemy
from flask import send_from_directory
import os
from flask_wtf import FlaskForm
from wtforms import StringField,SubmitField
from wtforms.validators import DataRequired
#中文显示
import sys
reload(sys)
#sys.setdefaultencoding("utf-8")
sys.getdefaultencoding()

#实例化一个flask对象
app = Flask(__name__)
#数据库,在mysql中创建
#mysql -uroot -p12345
#create database flask_books charset=utf8;
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:12345@127.0.0.1:3306/web_site'
#关闭警告信息
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.secret_key='aaabbbccc'

#实例化SQLAlchemy对象，参数为app
db = SQLAlchemy(app)

#定义表，表名，列字段，表间关系
#作者--书  relationship  反向
class Cate(db.Model):
    __tablename__='cates'
    id = db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(16),unique=True)
    #作者有几本书
    sites=db.relationship('Site',backref='cate')

    def __repr__(self):
        return 'Cate:%s' %self.name

#外键
#Site类继承自db.Model
class Site(db.Model):
    #表名，字段 id  name url
    __tablename__='sites'
    #id 主键
    id =db.Column(db.Integer,primary_key=True)
    #书名不唯一!!!!!!!!!!!!!!!!
    #name = db.Column(db.String(16),unique=True)
    #站点名
    name = db.Column(db.String(16))
    url =db.Column(db.String(150))
    #作者id唯一,加unique=True
    cate_id=db.Column(db.Integer,db.ForeignKey('cates.id'))

    def __repr__(self):
        return 'Site: %s %s' %(self.name,self.cate_id)

class SiteForm(FlaskForm):
    cate = StringField('分类',validators=[DataRequired()])
    site = StringField('名称',validators=[DataRequired()])
    url = StringField('url',validators=[DataRequired()])
    submit = SubmitField('提交')

'''
#删除表  重新运行又回原始数据？ 实际应用中迁移？
db.drop_all()
#创建表
db.create_all()
#加入数据，提交
#有表单，可在前端加入数据
ct1=Cate(name='常用')
ct2=Cate(name='工具')
db.session.add_all([ct1,ct2])
db.session.commit()


st1=Site(name='百度',url='https://www.baidu.com',cate_id=ct1.id)
st2=Site(name='一套表平台',url='https://10.6.133.106/ydata/login.do',cate_id=ct2.id)
st3=Site(name='B站',url='https://www.bilibili.com/',cate_id=ct1.id)
db.session.add_all([st1,st2,st3])
db.session.commit()
'''

#加入图标,ico/,目录下，favicon图标生成器生成，200K图片
@app.route('/favicon.ico')#设置icon
def favicon():
    return send_from_directory(os.path.join(app.root_path, 'static'),#对于当前文件所在路径,比如这里是static下的favicon.ico
                               'ico/favicon.ico', mimetype='image/vnd.microsoft.icon')

@app.route('/delete_cate/<cate_id>')
def delete_cate(cate_id):
    cate=Cate.query.get(cate_id)
    if cate:
        try:
            Site.query.filter_by(cate_id=cate.id).delete()
            db.session.delete(cate)
            db.session.commit()
        except Exception as e:
            flash('删除分类出错')
    else:
        flash('分类找不到')

    return redirect(url_for('index'))

@app.route('/delete_site/<site_id>')
def delete_site(site_id):
    site= Site.query.get(site_id)
    if site:
        try:
            db.session.delete(site)
            db.session.commit()
        except Exception as e:
            flash('删除出错')
            db.session.rollback()
    else:
        flash('site没找到')

    return redirect(url_for('index'))


#路由
@app.route('/',methods=['GET','POST'])
def index():
    site_form =SiteForm()
    #提交信息成功，获取字段值，查询分类字段是否存在，存在---查询站点名称是否存在，如果存在同名，已存在同url网址，不存在则填加
    if site_form.validate_on_submit():
        cate_name=site_form.cate.data
        site_name=site_form.site.data
        url_name=site_form.url.data
        cate=Cate.query.filter_by(name=cate_name).first()
        #如果作者存在
        if cate:
            #这句在所有书籍里查找,-----改为在告作者里查找
            #book = Book.query.filter_by(name=book_name).first(),两个条件，书名和作者id
            tongmin_site = Site.query.filter_by(name=site_name,cate_id=cate.id).first()
            #flash(tongmin_book)
            #book = Author.query.filter_by(name=book_name).first()
            #flash(book)
            #book = Author.query.filter_by(book=boo)
            #如果书籍存在,不同作者可以有同名书籍
            #if tongmin_book:
            if tongmin_site:
                flash('已存在同名网址')
            #如果书籍不存在,填加书籍
            else:
                try:
                    new_site=Site(name=site_name,url=url_name,cate_id=cate.id)
                    db.session.add(new_site)
                    db.session.commit()
                except Exception as e:
                    print(e)
                    flash('添加网址失败')
                    db.session.rollback()
        else:
            #分类不存在，填加分类，填加网址
            try:
                new_cate=Cate(name=cate_name)
                db.session.add(new_cate)
                db.session.commit()

                new_site=Site(name=site_name,url=url_name,cate_id=new_cate.id)
                db.session.add(new_site)
                db.session.commit()
            except Exception as e:
                print(e)
                flash('添加分类和网址失败')
                db.session.rollback()

    else:
        if request.method=='POST':
            flash('参数不全')


    #查询，查询所有结果，前端根据需要显示
    #类名.query.all(), 查询所有作---对象列表
    cates=Cate.query.all()
    # print(authors)
    # print(authors.name)
    # for author in authors:
    #     print(f'{author.id},{author.name}')
    #     for book in author.books:
    #         print(f'{book.name}')
    #传入对象
    return  render_template('sites.html',cates=cates,form=site_form)

if __name__ =='__main__':
    app.run()


